/**
 * 画布
 * 子弹
 */
import AbstractCanvas from "./abstract/AbstractCanvas";
import ModelBullet from "../model/Bullet";
import tank from "./Tank";
import config from "../config";
import player from "./Player";
import audio from "../service/audio";

/**
 * 画布是单例模式
 * 在一个图层，所以只需要new一个实例即可。
 */
export default new (class extends AbstractCanvas implements ICanvas {
        // 敌方坦克运动定时器
        intervalId: number = 0;

        render(): void {
            // super：调用父类的方法
            // super.createModels()
            // 调用渲染模型，防止每次重新渲染时，又生成新的模型实例
            // super.renderModels();
            console.log("bullet", Number((100 / config.bullet.speed).toFixed(3)))
            //bind:绑定this
            this.intervalId = setInterval(() => {
                // this.createBullet.bind(this)
                //自定义子弹的渲染函数：子弹创建
                this.createModelsBullet()
                // 调用渲染模型，防止每次重新渲染时，又生成新的模型实例
                super.renderModels();
            }, Number((100 / config.bullet.speed).toFixed(3)))
        }

        //停止，停止移动
        stop() {
            clearInterval(this.intervalId)
        }

        //自定义子弹的渲染函数：子弹创建
        createModelsBullet() {
            // 子弹的创建需要根据坦克的画布中的坦克模型数量来决定需要发送多少颗子弹
            tank.models.forEach(tItem => {
                // 查询是否存在同样名称的坦克的子弹，如果有，表示该坦克已经发射子弹了
                const isExists = this.models.some(model => model.tank === tItem)
                //如果子弹不存在，放置子弹
                if (!isExists) {
                    this.models.push(new ModelBullet(tItem))
                    // 敌方坦克开火，发出声音
                    audio.bulletFire()
                }
            })
            // console.log(this.models)
        }

        // 我方坦克发射子弹
        addPlayerBullet() {
            this.models.push(new ModelBullet(player.models[0]))
            // 玩家坦克开火，发出声音
            audio.bulletFire()
        }

        // 抽象方法，返回模型
        model(): ConstructorModelBullet {
            return ModelBullet;
        }

        // 抽象方法：返回模型数量,子弹数量的创建由坦克决定，这里默认给0
        num(): number {
            return 0;
        }
    }
)('bullet')


